package cube.data;

import java.util.HashMap;
import java.util.Map;

/**
 * 双向一一映射
 * 
 * @author abiao
 */
public class BIMap<A, B> {

    /**
     * A-B 映射
     */
    private Map<A, B> abm = new HashMap<A, B>();

    /**
     * B-A 映射
     */
    private Map<B, A> bam = new HashMap<B, A>();

    /**
     * 放入数据
     */
    public void put(A a, B b) {
        if (bam.containsKey(b)) {
            abm.remove(getA(b));
        }
        if (abm.containsKey(a)) {
            bam.remove(getB(a));
        }
        bam.put(b, a);
        abm.put(a, b);
    }

    /**
     * 通过A获取B
     */
    public B getB(A a) {
        return abm.get(a);
    }

    /**
     * 通过B获取A
     */
    public A getA(B b) {
        return bam.get(b);
    }

    /**
     * 检查是否包含B
     */
    public boolean containsB(B b) {
        return bam.containsKey(b);
    }

    /**
     * 检查是否包含A
     */
    public boolean containsA(A a) {
        return abm.containsKey(a);
    }

    /**
     * 移除A及关联的B
     */
    public void removeA(A a) {
        if (containsA(a)) {
            bam.remove(abm.remove(a));
        }
    }

    /**
     * 移除B及关联的A
     */
    public void removeB(B b) {
        if (containsB(b)) {
            abm.remove(bam.remove(b));
        }
    }
}
